home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / XINE-1.ZIP / INJECTOR.ZIP / SRC / DOIPPKT.C next >
Encoding:
C/C++ Source or Header  |  1996-10-09  |  3.7 KB  |  220 lines

  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. void err(int l)
  6. {
  7.     printf("Syntax error in line %u\n\n",l);
  8. }
  9.  
  10.  
  11.  
  12. unsigned int in_cksum(unsigned char * addr,unsigned len)
  13. {
  14.     unsigned nleft=len;
  15.     unsigned int *w=(unsigned int *) addr;
  16.     unsigned long sum=0;
  17.     unsigned int answer=0;
  18.  
  19.     while (nleft>1)
  20.     {
  21.         sum += *(w++);
  22.         nleft -= 2;
  23.     }
  24.     if (nleft==1)
  25.     {
  26.         *(unsigned char *)(&answer)=*(unsigned char *)w; /* ? */
  27.         sum += answer;
  28.     }
  29.     sum = (sum >> 16) + (sum & 0xffff);
  30.     sum += (sum >> 16);
  31.     answer=~sum;
  32.     return(answer);
  33. }
  34. int main(int argc, char * * argv)
  35. {
  36.     FILE *fi, *fo;
  37.     unsigned char s[200], b[2000], *p;
  38.     unsigned int bc, t, l, isudp=0, udpstart, hsize, hsize4, i,
  39.              udpsize, fbc, isicmp, htemp, istcp,
  40.              ethstart=0;
  41.     unsigned checksum,sum;
  42.  
  43.     if (argc!=3) /* was 2 */
  44.     {
  45.         puts("Syntax: doippkt [in] [out] \n\n");
  46.         exit(1);
  47.     }
  48.  
  49.     if ( !(fi=fopen(argv[1],"r")) || !(fo=fopen(argv[2],"wb")) )
  50.     {
  51.         puts("Troubles with i/o files \n\n");
  52.         exit(1);
  53.     }
  54.  
  55.     bc=0;
  56.     l=1;
  57.     for (;;l++)
  58.     {
  59.         if (!fgets(s,200,fi)) break;
  60.         switch (s[0])
  61.         {
  62.             case '\n':
  63.             case '\r':
  64.             case '#': break;
  65.             case 'c':
  66.             {
  67.                 if (!sscanf(s+1,"%u",&t)) err(l);
  68.                 b[bc]= t;
  69.                 bc ++;
  70.                 break;
  71.             }
  72.             case 'u':
  73.             {
  74.                 if (!sscanf(s+1,"%u",&t)) err(l);
  75.                 b[bc++]= t >> 8;
  76.                 b[bc]= t & 0xff;
  77.                 bc ++;
  78.                 break;
  79.             }
  80.             case 'b':
  81.             {
  82.                 if (!sscanf(s+1,"%x",&t)) err(l);
  83.                 b[bc]=(unsigned char) t;
  84.                 bc ++;
  85.                 break;
  86.             }
  87.             case 'w':
  88.             {
  89.                 if (!sscanf(s+1,"%x",&t)) err(l);
  90.                 b[bc++]= t >> 8;
  91.                 b[bc]= t & 0xff;
  92.                 bc ++;
  93.                 break;
  94.             }
  95.             case 's':
  96.             {
  97.                 strcpy(b+bc,s+1);
  98.                 bc+=strlen(s+1)-1;
  99.                 break;
  100.             }
  101.             case 'd':
  102.             {
  103.                 isudp=1;
  104.                 udpstart=bc;
  105.                 break;
  106.             }
  107.             case 'i':
  108.             {
  109.                 isicmp=1;
  110.                 udpstart=bc;
  111.                 break;
  112.             }
  113.             case 't':
  114.             {
  115.                 istcp=1;
  116.                 udpstart=bc;
  117.                 break;
  118.             }
  119.             case 'e':
  120.             {
  121.                 ethstart=bc;
  122.                 break;
  123.             }
  124.         }
  125.     }
  126.  
  127.     if (!ethstart)
  128.     {
  129.         puts("No ethernet start delimiter!\n");
  130.         exit(1);
  131.     }
  132.  
  133.     hsize=bc-ethstart;
  134.     p=b+ethstart;
  135.  
  136.     if (isudp || istcp || isicmp) hsize=udpstart-ethstart;
  137.     if (hsize & 0x03)
  138.     {
  139.         puts("Packet header not aligned on 32bit boundary\n");
  140.         exit(1);
  141.     }
  142.     hsize4=hsize>>2;
  143.     if (hsize4<5)
  144.     {
  145.         puts("Header must be at least 5 dword long\n");
  146.         exit(1);
  147.     }
  148.  
  149.     p[0] |= hsize4;
  150.     p[2] = (bc-ethstart) >> 8;
  151.     p[3] = (bc-ethstart) & 0xff;
  152. /*    p[2] = (bc-ethstart) >> 8;
  153.     p[3] = (bc-ethstart) & 0xff;*/
  154.     memset(p+10,0,2);
  155.     checksum=in_cksum(p, hsize);
  156.     p[11]=(checksum >> 8);
  157.     p[10]=(checksum & 0xff);
  158.  
  159.  
  160.  
  161.     if (isudp)
  162.     {
  163.         udpsize=bc-hsize-ethstart;
  164.         p[hsize+4]= (udpsize >> 8);
  165.         p[hsize+5]= (udpsize & 0xff);
  166.         p[hsize+6]=0;
  167.         p[hsize+7]=0;
  168.         fbc=bc;
  169.         if ( (fbc&1) )
  170.         {
  171.             p[fbc-ethstart]=0;
  172.             fbc++;
  173.         }
  174.         memcpy(p+fbc-ethstart,p+12,4);
  175.         fbc+=4;
  176.         memcpy(p+fbc-ethstart,p+16,4);
  177.         fbc+=4;
  178.         p[fbc++-ethstart]=0;
  179.         p[fbc++-ethstart]=p[9];
  180.         p[fbc++-ethstart]=p[hsize+4];
  181.         p[fbc++-ethstart]=p[hsize+5];
  182.         sum=in_cksum(p+hsize,fbc-hsize-ethstart);
  183.         if (!sum) sum=0xffff;
  184.         p[hsize+7]= (sum >> 8);
  185.         p[hsize+6]= (sum & 0xff);
  186.     }
  187.     if (istcp)
  188.     {
  189.         udpsize=bc-hsize-ethstart;
  190. /*        p[hsize+12]=6;             */
  191. /*        p[hsize+5]= (udpsize & 0xff);*/
  192.         p[hsize+16]=0;
  193.         p[hsize+17]=0;
  194.         fbc=bc;
  195.         if ( (fbc&1) )
  196.         {
  197.             p[fbc-ethstart]=0;
  198.             fbc++;
  199.         }
  200.         memcpy(p+fbc-ethstart,p+12,4);
  201.         fbc+=4;
  202.         memcpy(p+fbc-ethstart,p+16,4);
  203.         fbc+=4;
  204.         p[fbc++-ethstart]=0;
  205.         p[fbc++-ethstart]=p[9];
  206.         p[fbc++-ethstart]=(bc-hsize-ethstart) >> 8;
  207.         p[fbc++-ethstart]=(bc-hsize-ethstart) & 0xff;
  208.         sum=in_cksum(p+hsize,fbc-hsize-ethstart);
  209.         if (!sum) sum=0xffff;
  210.         p[hsize+17]= (sum >> 8);
  211.         p[hsize+16]= (sum & 0xff);
  212.     }
  213.  
  214.     fwrite(b,bc,1,fo);
  215.     fclose(fo);
  216.  
  217.     return 0;
  218. }
  219.  
  220.